﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Ruandao.MiniFace
{
    public class ListWidget : ListWidgetBase
    {
        /// <summary>
        /// 指定数据源对象，当存在该设置项时，直接微件所处的环境上下文中获取需要列表显示的内容，
        /// 不再使用微件中的搜索条件来检索数据。
        /// DataSource是可以通过Python求值的表达式，如"ViewBag.ContentList，ViewBag.Catalog.ContentList"等等。
        /// </summary>
        //public string DataList { get; set; }

        public ListWidget()
        {
        }

        protected override List<KeyValuePair<string, dynamic>> VariablesToPython(TemplateContext templateContext, out dynamic dataList)
        {
            var list = new List<KeyValuePair<string, dynamic>>();
            dynamic widgetArgs = new System.Dynamic.ExpandoObject();

            // 参数：DataList
            string dataListArg;
            if (!Properties.TryGetValue("DataList", out dataListArg))
            {
                throw new Exception("List微件必须设置DataListt属性。");
            }
            widgetArgs.DataList = dataListArg;

            // 可选参数：DataName，默认"DataList"。
            string dataNameArg = "DataList";
            if (Properties.ContainsKey("DataName")) dataNameArg = Properties["DataName"];
            widgetArgs.DataName = dataNameArg;

            // 可选参数：GroupNumber， 默认为1，表示不使用分组呈现。
            if (Properties.ContainsKey("GroupNumber")) this.GroupNumber = int.Parse(Properties["GroupNumber"]);
            widgetArgs.GroupNumber = this.GroupNumber;

            // 可选参数：IdName，默认为""，表示不使用当前项模板。
            if (Properties.ContainsKey("IdName")) this.IdName = Properties["IdName"];
            widgetArgs.IdName = this.IdName;

            // 可选参数：CurrentId，默认为""，表示不使用当前项模板。
            if (Properties.ContainsKey("CurrentId")) this.CurrentId = Properties["CurrentId"];
            widgetArgs.CurrentId = this.CurrentId;

            list.Add(new KeyValuePair<string, dynamic>("WidgetArgs", widgetArgs));

            try
            {
                dataList = PythonEngine.GetEngine().Execute(dataListArg, templateContext.PythonScope);
            }
            catch (MissingMemberException except)
            {
                throw new Exception("无法获取List微件中设置的DataList为" + dataListArg + "的对象。", except);
            }
            list.Add(new KeyValuePair<string, dynamic>(dataNameArg, dataList));

            return list;
        }
    }
}
